You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

102 lines
3.5 KiB

import { defineEventHandler, getRouterParam, readBody, setResponseHeaders } from "h3";
import { getCurrentUser, getConfigUser, getConfigGlobal } from "#server/utils/context";
import { resolveAgentIdentity } from "#server/service/agent/identity";
import { getSessionByIdAndUser } from "#server/service/agent/session";
import { getAgentBySlug } from "#server/service/agent/agent";
import { executeChat } from "#server/service/agent/chat-engine";
import { registerAbortController, unregisterAbortController } from "#server/service/agent/abort-manager";
export default defineEventHandler(async (event) => {
const agentSlug = getRouterParam(event, "agentSlug");
if (!agentSlug) {
throw createError({ statusCode: 400, statusMessage: "参数无效" });
}
const agent = await getAgentBySlug(agentSlug);
if (!agent) {
throw createError({ statusCode: 404, statusMessage: "agent 不存在" });
}
const identity = await resolveAgentIdentity(event);
if (!identity.userId && !identity.tempToken) {
throw createError({ statusCode: 401, statusMessage: "请先登录或创建临时会话" });
}
const body = await readBody(event);
const { sessionId, content, editMessageId, regenerate, continueAfterApproval, approvalToolCallId, approved, approvalReason, enableThinking, enableTools } = body as {
sessionId: string;
content: string;
editMessageId?: string;
regenerate?: boolean;
continueAfterApproval?: boolean;
approvalToolCallId?: string;
approved?: boolean;
approvalReason?: string;
enableThinking?: boolean;
enableTools?: boolean;
};
if (!sessionId) {
throw createError({ statusCode: 400, statusMessage: "参数无效" });
}
const isApprovalContinue = continueAfterApproval === true && approvalToolCallId;
if (!isApprovalContinue && (!content || typeof content !== "string" || content.trim().length === 0)) {
throw createError({ statusCode: 400, statusMessage: "参数无效" });
}
const session = await getSessionByIdAndUser(sessionId, identity.userId, identity.tempToken);
if (!session) {
throw createError({ statusCode: 404, statusMessage: "会话不存在" });
}
if (session.agentId !== agent.id) {
throw createError({ statusCode: 400, statusMessage: "会话不属于该 agent" });
}
const ip = getRequestIP(event, { xForwardedFor: true }) || "unknown";
let preferredModelId: number | null = null;
let reviewApprovalMode: string = "manual";
if (identity.userId) {
preferredModelId = (await getConfigUser(event, "preferredLlmModelId")) ?? null;
reviewApprovalMode = (await getConfigUser(event, "reviewApprovalMode")) ?? "manual";
}
const globalDefaultModelId = (await getConfigGlobal("agentDefaultModelId")) ?? null;
const user = identity.userId ? await getCurrentUser(event) : null;
const { response } = await executeChat({
agent,
session,
user: user ? { id: user.id, role: user.role } : null,
tempToken: identity.tempToken,
body: {
content,
editMessageId,
regenerate,
continueAfterApproval,
approvalToolCallId,
approved,
approvalReason,
enableThinking,
enableTools,
},
ip,
preferredModelId,
globalDefaultModelId,
reviewApprovalMode,
requestId: event.context.requestId,
registerAbort: registerAbortController,
unregisterAbort: unregisterAbortController,
setRateLimitHeaders: (headers) => {
setResponseHeaders(event, headers);
},
onClientClose: (cb) => {
event.node.req.on("close", cb);
},
});
return response;
});